#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int N = 1010;
// 注意到总和为k的倍数就是取模为0
// 并且取模运算支持加减
// 所以可以用模数来进行处理
// 并且利用贪心，只需要求每种模数中最大的三个数即可
vector<int> mod[N];
int dp[3*N][4][N];
int n, m;
int main()
{
    cin >> n >> m;
    for(int i = 0; i < n; ++i)
    {
        int tmp;
        cin >> tmp;
        mod[tmp % m].push_back(tmp);
    }
    int cnt = 1;
    memset(dp, -0x3f, sizeof dp);
    for(int i = 0; i <= n; ++i) dp[i][0][0] = 0;
    
    for(int i = 0; i < m; ++i)
    {
        sort(mod[i].begin(), mod[i].end(), greater<int>());
        for(int u = 0; u < min(3, (int)mod[i].size()); ++u)
        {
            int v = mod[i][u];
            for(int j = 1; j <= 3; ++j)
                for(int k = 0; k < m; ++k)
                    dp[cnt][j][k] = max(dp[cnt - 1][j][k], dp[cnt - 1][j - 1][((k - i) % m + m) % m] + v);
            cnt++;
        }
    }
    cout << dp[cnt - 1][3][0] << endl;
    return 0;
}